iT邦幫忙

DAY 6
1

Ruby on Rails 實戰聖經 - 初心者的30天學習記錄系列 第 6

Ruby on Rails實戰聖經 (06) - 新增資料

  • 分享至 

  • xImage
  •  

在index這頁最下方加了一個 Add post的link,連到new這頁來新增資料

<%= link_to 'Add post', :controller => 'guests', :action => 'new' %>

首先要在guests_controller的 new action新增一個實例物件guest,繼承Guest這個class

def new
@guest = Guest.new
end

接著在new.html.erb這個view上我們要新增一個表單來傳送user輸入的資料

<%= form_for @guest, :url => {:controller => 'guests', :action => 'create' } do |f| %>
<%= f.label :title, "Title" %>
<%= f.text_field :title %>

<%= f.label :description, "Description" %>
<%= f.text_area :description %>

<%= f.submit "Create" %>
<% end %>

這邊form_for這個區塊會建立一個html表單綁定剛剛我們新建立的@guest物件,但這個表單只能基於這個Model有的屬性(在這個例子是title跟description)。

Rails偏好使用form_for而不是讓你手寫表單HTML,這是因為程式碼可以更加簡潔,而且可以明確地連結在Model物件上。 ---實戰聖經

當user點擊create時,瀏覽器就會將這個表單傳送至guests_controller的create action
我們在create action一樣new一個實例物件@guest來裝這個表單,並儲存之後將頁面轉回至index

def create
@guest = Guest.new(params[:guest])
@guest.save
redirect_to :action => :index
end
//以上是聖經的寫法,但我執行會出現ActiveModel::ForbiddenAttributesError這個錯誤

後來在stackoverflow找到的解法是要另外寫一個function來接這個params hash
然後再丟進去Guest這個物件裡:

@guest = Guest.new(params[:guest]) 

這行改成

@guest = Guest.new(guests_params)

並加入

private
def guests_params
params.require(:guest).permit(:title, :description)
end

上一篇
Ruby on Rails實戰聖經 (05) - CRUD - 列出所有資料
下一篇
Ruby on Rails實戰聖經 (07) - 列出個別資料
系列文
Ruby on Rails 實戰聖經 - 初心者的30天學習記錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言